/**
加载：
sudo modprobe uio
sudo insmod ./demo.ko
加载后，会在/dev目录下创建字符设备文件/dev/uio0。如果再加载一个uio驱动，则会继续创建/dev/uio1。
同时，也会在/sys/class/uio下创建一个目录/sys/class/uio/uio0。以此类推。
*/
 
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/uio_driver.h>

#define UIO_DEMO_NAME "uio_demo"

struct uio_info uio_demo_info = {
	.name = UIO_DEMO_NAME,
	.version = "0.1",
	.irq = UIO_IRQ_NONE,
};
 
static int uio_demo_probe(struct device *dev);
static int uio_demo_remove(struct device *dev);
static struct device_driver uio_dummy_driver = {
	.name = UIO_DEMO_NAME,
	.bus = &platform_bus_type,
	.probe = uio_demo_probe,
	.remove = uio_demo_remove,
};
 
static int uio_demo_probe(struct device *dev)
{
	printk("uio_demo_probe( %p)\n", dev);

	if( uio_register_device(dev, &uio_demo_info))
		return -ENODEV;
	return 0;
}
 
static int uio_demo_remove(struct device *dev)
{
	uio_unregister_device(&uio_demo_info);
 
	return 0;
}
 
static struct platform_device * uio_dummy_device;
 
static int __init uio_demo_init(void)
{
	uio_dummy_device = platform_device_register_simple(UIO_DEMO_NAME, -1,
			NULL, 0);
 
	return driver_register(&uio_dummy_driver);
}
 
static void __exit uio_demo_exit(void)
{
	platform_device_unregister(uio_dummy_device);
	driver_unregister(&uio_dummy_driver);
}
 
module_init(uio_demo_init);
module_exit(uio_demo_exit);
 
MODULE_LICENSE("GPL");
MODULE_AUTHOR("mdy");
MODULE_DESCRIPTION("UIO Demo Driver");